#ifndef PRINTER_HPP
#define PRINTER_HPP

#include <std/cstddef>
#include <std/cstdint>
#include <cpp/AbstractTerminal.hpp>
class Printer
{
	public:
		enum class Flags
		{
			Hex,Dec,Bin,BoolAlpha,NoBoolAlpha,ShowBase,NoShowBase,
		};
		Printer(AbstractTerminal& terminal);
		Printer& operator<<(char arg);
		Printer& operator<<(const char* arg);
		Printer& operator<<(short int arg);
		Printer& operator<<(short unsigned int arg);
		Printer& operator<<(int arg);
		Printer& operator<<(unsigned int arg);
		Printer& operator<<(long int arg);
		Printer& operator<<(long unsigned int arg);
		Printer& operator<<(long long int arg);
		Printer& operator<<(long long unsigned int arg);
		Printer& operator<<(bool arg);
		Printer& operator<<(void* arg);
		Printer& operator<<(const Flags& arg);

	private:
		AbstractTerminal& _terminal;
		size_t _numericBase{10};
		bool _boolAlpha{true};
		bool _showBase{false};
		static constexpr size_t _bufferLength{sizeof(uintmax_t) * 8};

		char _buffer[_bufferLength];

};
extern Printer out;

#endif
